- Comprendre le fonctionnement d'une classification ;
- Mettre en place des algorithmes de classification.
Activité 2 - Algorithmes KNN
KNN signifie K near-neighbors, soit les K plus proches voisins.
Un algorithme KNN est un algorithme dit de classification
, permettant de déterminer l'appartenance d'une donnée à un groupe, suivant ses K plus proches voisins.
Le TP est découpé en 2 parties :
- Visualiser des données pour déterminer graphiquement l'appartenance ;
- Créer un algorithme qui déterminera pour nous une valeur d'appartenance.
Visualiser un jeu de données
À partir d'informations stockées dans un fichier csv, nous allons programmer un graphe en nuage de points, pour déterminer graphiquement des futures valeurs.
Un jeu de données est une collection de données, accessibles, et structurées.
Les données sont réparties en un ensemble d'attributs
, permettant d'obtenir plusieurs informations sur une donnée.
Les jeux de données sont souvent stockés dans des fichiers au format csv
(Commat Separate Value) ; c'est un type de fichier où les données enregistrées sont séparées par des points virgule.
Avec ce type de fichier, nous pouvons très facilement récupérer des informations pour les manipuler.
- Télécharger le fichier CSV reussite_exam.csv.
- Ouvrir ce fichier sur excel pour visualiser les informations stockées.
Sur la première ligne, on peut voir quelles sont les informations, séparées par des virgules.
- Repérer leur nom et les noter quelque part, elles serviront plus tard.
Le document indique la réussite ou l'échec d'un élève à un devoir, suivant son temps de révision, et sa précédente note (notée sur 100).
Pour manipuler ce fichier sur python, nous allons utiliser 2 bibliothèques différentes :
pandas
pour importer des fichiers csv;matplotlib
pour dessiner des graphes.
Pour matplotlib, il faudra écrire cette ligne :
import matplotlib.pyplot as plt
On importe la fonctionnalité pyplot de matplotlib, et on renomme le tout en plt (pour éviter d'avoir à écrire "pyplot" partout).
Pour utiliser les différentes fonctions de pyplot, il faudra écrire plt.fonction()
, où fonction()
représente une des fonctions à utiliser.
- Importer les bibliothèques pands et pyplot de matplotlib.
pandas possède une fonction appelée read_csv(fichier)
, qui ouvre un fichier CSV, et le retourne.
- Utiliser cette fonction, et stocker dans une variable
exam
le fichier ouvert.
Nous allons maintenant séparer les 3 informations du document en 3 listes différentes :
liste_heure
: représentant les valeurs de l'abscisse du graphe ;liste_score
: représentant les valeurs de l'ordonnée du graphe ;liste_reussite
: indiquant l'appartenance au groupe échec ou réussite des points du graphe.
On donne la ligne de code suivante :
liste_heure = exam.loc[:,"Heure_etude"].values
Qui permet de stocker dans la variable liste_heure
l'ensemble des informations de la colonne "Heure_etude" du fichier csv.
- En utilisant l'exemple de cette ligne, rajouter 2 lignes permettant de stocker les listes des 2 dernières informations.
On dispose des fonctions suivantes :
- Rajout de points
- Légende abscisse
- Légende ordonnée
- Titre du graphe
- Générer le graphe
- Montrer le graphe
scatter(x,y,color='',label='')
Rajoute les points de la liste x et y, avec une couleur de point, et la légende associée au point :
x
: listes des abscisses ;y
: liste des ordonnées ;color=''
: couleur à préciser (str) ;label=''
: légende du point (str).
xlabel(legende)
Donne une légende à l'axe x (str).
ylabel(legende)
Donne une légende à l'axe y (str).
title(titre)
Donne un titre au graphe (str).
legend()
Génère le graphe suivant les fonctions précédentes.
show()
Affiche le graphe généré.
- À l'aide des fonctions du tableau, écrire les instructions permettant d'afficher un graphe dont l'abscisse correspond au
nombre d'heures
, et l'ordonnée auscore
. On pourra donner une légende aux axes x et y, et un titre au graphe.
Si tout est bien écrit, python devrait générer ceci :
Chaque point est un élève, correspondant à son nombre d'heures révisées pour un devoir, et son score à son précédent devoir.
Avec ce graphe, on ne distingue pas qui a réussi ou non le devoir.
Il va falloir utiliser la 3ème liste pour faire 2 types de points différents :
- Des
points rouges
, correspondant à un élève qui a échoué; - Des
points verts
, correspondant à un élève qui a réussi.
La fonction scatter
permettant l'affichage de tous les points, il faut lui préciser de ne prendre que des points d'une liste répondant à un critère donné.
Pour choisir des points en fonction d'un critère, on peut utiliser l'instruction : [liste_groupe == critere]
sur une liste de points. Cela signifie que sur une liste donnée, on ne va prendre que des points dont les points de la liste des groupes répondent au critère donné.
- Modifier votre code, pour que le graphe n'affiche que les points correspondant aux élèves ayant échoués. On mettra ces points en rouge, ainsi que le label échec.
- En prenant exemple sur la ligne de code préc édente, rajouter la ligne permettant d'afficher les points des élèves qui ont réussi. On les affichera en vert avec le label réussi.
Algorithme du KNN
On souhaite vérifier si un élève va réussir ou non son devoir, suivant son temps de révisions, et la note de son dernier devoir.
Le KNN nous permettra de tenter de deviner sa réussite ou non grâce aux données déjà présentes (donc avec des profils d'élèves similaires).
- Rajouter un point sur le graphe grâce à la fonction
scatter
, avec les coordonnées que vous voulez. On mettra la couleur"k"
, correspondant à une couleur visuelle sur le graphe pour déterminer la position du point. - Déterminer graphiquement si, avec les valeurs saisies, l'élève va réussir ou échouer au devoir.
Ce dont on a besoin pour faire l'algorithme du KNN :
data
: Un jeu de données sous la forme d'une liste ou dictionnaire;c
: Une donnée dont on souhaite trouver le type;- Savoir calculer une
distance
entre 2 points; k
: Un entier représentant le nombre de voisins que l'on souhaite prendre.
Voici l'algorithme du KNN :
- On calcule les distances entre
c
, et toutes les données dedata
; - On prend les
k
points les plus proches; - On détermine le type de
c
en fonction du type apparaissant le plus parmi les points.
Distance
Il existe plusieurs formules pour calculer des distances entre 2 points. Chaque point (d1, d2) est représenté par leurs coordonnées (x1,y1) et (x2,y2) respectivement. On dispose des formules suivantes :
- Distance euclidienne :
- Distance de Manhattan :